﻿///***************************************************************
/// 시  스  템 : SMFramework.Web.UI.WebControls
/// 단위시스템 : GridView
/// 계      층 : Framework WebControls
/// 프로그램명 : SMGridView
/// 파  일  명 : SMGridView.cs
/// 설      명 : 웹콘트롤 유틸리티 - 그리드뷰
///***************************************************************
/// 수정ID 일자       이름     내용
///---------------------------------------------------------------
/// CH001  2008-07-02 송시명   최초 작성
///***************************************************************
using System;
using System.Collections;
using System.Web.UI.WebControls;
using System.Web.UI;

namespace SMFramework.Web.UI.WebControls.SMGridView
{
	/// <summary>
	/// 웹콘트롤 유틸리티 - 그리드뷰
	/// </summary>
	public class SMGridView
	{
		/// <summary>
		/// Page
		/// </summary>
		protected System.Web.UI.Page mPage;

		/// <summary>
		/// GridView
		/// </summary>
		protected System.Web.UI.WebControls.GridView mGv;

		#region Constuctor
		/// <summary>
		/// 생성자
		/// </summary>
		public SMGridView()
		{
		}

		/// <summary>
		/// 생성자 (Page, GridView)
		/// </summary>
		/// <param name="cPage"></param>
		/// <param name="cGv"></param>
		public SMGridView(System.Web.UI.Page cPage, ref System.Web.UI.WebControls.GridView cGv)
		{
			mPage = cPage;
			mGv = cGv;
		}
		#endregion

		#region 그리드뷰를 세로로 머지(RowSpanGridView)
		
		/// <summary>
		/// 그리드뷰를 세로로 머지 - 모든 컬럼 - 작동불능
		/// </summary>
		/// <param name="po_gv">그리드뷰</param>
		public void RowSpanGridView(GridView po_gv)
		{
			//첫번째 컬럼부터
			for (int j = 0; j > po_gv.Columns.Count; j++)
			{
				int RowSpan = 1;
				
				//그리드를 끝에서부터 셉니다.
				for (int i = po_gv.Rows.Count - 1; i > 0; i--)
				{
					//현재 셀보다 한 rows위에 셀의 값과 비교하여 같으면 rowspan합니다.
					if (po_gv.Rows[i].Cells[j].Text == po_gv.Rows[i - 1].Cells[j].Text)
					{
						RowSpan++;
						po_gv.Rows[i - 1].Cells[j].RowSpan = RowSpan;
						po_gv.Rows[i].Cells[j].Visible = false;
					}
					else
					{
						RowSpan = 1;
					}
				}
			}
			mGv = po_gv;
		}
		
		/// <summary>
		/// 그리드뷰를 세로로 머지 - 지정된 컬럼
		/// </summary>
		/// <param name="po_gv">그리드뷰</param>
		/// <param name="pi_index">머지할 인덱스 값</param>
		public void RowSpanGridView(GridView po_gv, int pi_index)
		{
			int RowSpan = 1;
			
			//그리드를 끝에서부터 셉니다. 
			for (int i = po_gv.Rows.Count - 1; i > 0; i--)
			{
				//현재 셀보다 한 rows위에 셀의 값과 비교하여 같으면 rowspan합니다.
				if (po_gv.Rows[i].Cells[pi_index].Text == po_gv.Rows[i - 1].Cells[pi_index].Text)
				{
					RowSpan++;
					po_gv.Rows[i - 1].Cells[pi_index].RowSpan = RowSpan;
					po_gv.Rows[i].Cells[pi_index].Visible = false;
				}
				else
				{
					RowSpan = 1;
				}
			}
			mGv = po_gv;
		}

		#endregion

		#region 그리드뷰를 가로로 머지(ColumnSpanGridView)

		/// <summary>
		/// 그리드뷰를 가로로 머지 - 모든 셀은 visible = true이어야 한다.
		/// </summary>
		/// <param name="po_gv">그리드뷰</param>
		/// <param name="pi_row_index">머지할 인덱스 값</param>
		public void ColumnSpanGridView(GridView po_gv, int pi_row_index)
		{
			int li_column_span = 1;

			//그리드를 끝에서부터 셉니다.
			for (int i = po_gv.Columns.Count - 1; i > 0; i--)
			{
				//현재 셀보다 하나 앞의 셀 값과 비교하여 같으면 colspan
				if (po_gv.Rows[pi_row_index].Cells[i].Text == po_gv.Rows[pi_row_index].Cells[i - 1].Text)
				{
					li_column_span++;
					po_gv.Rows[pi_row_index].Cells[i - 1].ColumnSpan = li_column_span;
					po_gv.Rows[pi_row_index].Cells[i].Visible = false;
				}
				else
				{
					li_column_span = 1;
				}
			}
			mGv = po_gv;
		}

		#endregion

		#region 멀티헤더 (SetMultiHeader)
		
		/// <summary>
		/// 멀티헤더 - Class적용안함
		/// </summary>
		/// <param name="e"></param>
		/// <param name="GetCels"></param>
		public void SetMultiHeader(GridViewRowEventArgs e, SortedList GetCels)
		{
			this.SetMultiHeader(e, GetCels, "");
		}

		/// <summary>
		/// 멀티헤더 - Class적용
		/// </summary>
		/// <param name="e"></param>
		/// <param name="GetCels"></param>
		/// <param name="CellClass"></param>
		public void SetMultiHeader(GridViewRowEventArgs e, SortedList GetCels, string CellClass)
		{
			if (e.Row.RowType == DataControlRowType.Header)
			{
				GridViewRow row;
				IDictionaryEnumerator enumCels = GetCels.GetEnumerator();

				row = new GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);
				while (enumCels.MoveNext())
				{
					string[] cont = enumCels.Value.ToString().Split(Convert.ToChar(","));
					TableCell Cell = new TableCell();
					
					Cell.RowSpan = Convert.ToInt16(cont[2].ToString());
					Cell.ColumnSpan = Convert.ToInt16(cont[1].ToString());
					Cell.Controls.Add(new LiteralControl(cont[0].ToString()));
					
					if (CellClass.Length > 0)
					{
						Cell.Attributes.Add("class", CellClass);
					}
					else
					{
						Cell.HorizontalAlign = HorizontalAlign.Center;
						Cell.ForeColor = System.Drawing.Color.Black;
					}
					row.Cells.Add(Cell);
				}

				e.Row.Parent.Controls.AddAt(0, row);
			}
		}
		
		#endregion

		#region Row를 굵게 처리(BoldRowGridView)(DataKey) - 사용안함

		/// <summary>
		/// 특정 Row를 클릭했을때 비교값과 일치하면 그 Row를 굵게 처리한다.(DataKey) - 사용안함
		/// </summary>
		/// <param name="gv"></param>
		/// <param name="ls_key"></param>
		/// <param name="ls_compare_value"></param>
		public void BoldRowGridView(GridView gv, string ls_key, string ls_compare_value)
		{
			for (int i = 0; i < gv.Rows.Count; i++)
			{
				gv.Rows[i].Font.Bold = (gv.DataKeys[i].Values[ls_key].ToString() == ls_compare_value);
			}
		}

		#endregion

		#region Row를 굵게 처리(BoldRowGridView)(index) - 사용안함

		/// <summary>
		/// 특정 Row를 클릭했을때 비교값과 일치하면 그 Row를 굵게 처리한다.(index) - 사용안함
		/// </summary>
		public void BoldRowGridView(GridView gv, int li_target_index, string ls_compare_value)
		{
			for (int i = 0; i < gv.Rows.Count; i++)
			{
				gv.Rows[i].Font.Bold = (gv.Rows[i].Cells[li_target_index].Text == ls_compare_value);
			}
		}

		#endregion

		#region  Row를 굵게 처리 - 마지막 Row는 제외(BoldRowGridView) - 사용안함

		/// <summary>
		/// 특정 Row를 클릭했을때 비교값과 일치하면 그 Row를 굵게 처리한다.(index) - 마지막 Row는 제외 - 사용안함
		/// </summary>
		public void BoldRowGridView(GridView gv, int li_target_index, string ls_compare_value, int li_last_index)
		{
			for (int i = 0; i < (gv.Rows.Count + li_last_index); i++)
			{
				gv.Rows[i].Font.Bold = (gv.Rows[i].Cells[li_target_index].Text == ls_compare_value);
			}
		}

		#endregion
	}
}
